const onlyNumOnePoint = (number_only) => {
  number_only = number_only.toString()
  //先把非数字的都替换掉，除了数字和小数点
  number_only = number_only.replace(/[^\d.]/g, "");
  //必须保证第一个为数字而不是小数点
  number_only = number_only.replace(/^\./g, "");
  //保证只有出现一个小数点而没有多个小数点
  number_only = number_only.replace(/\.{2,}/g, ".");
  //保证小数点只出现一次，而不能出现两次以上
  number_only = number_only.replace(".", "$#$").replace(/\./g, "").replace("$#$", ".");
  //保证只能输入两个小数  
  number_only = number_only.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3');
  //一位小数
  // number_only = number_only.replace(/^(\-)*(\d+)\.(\d).*$/, '$1$2.$3');

  number_only = parseFloat(number_only)
  return number_only;
}
const onlyNumOneDecimal = (number_only) => {
  number_only = number_only.toString()
  //先把非数字的都替换掉，除了数字和小数点
  number_only = number_only.replace(/[^\d.]/g, "");
  //必须保证第一个为数字而不是小数点
  number_only = number_only.replace(/^\./g, "");
  //保证只有出现一个小数点而没有多个小数点
  number_only = number_only.replace(/\.{2,}/g, ".");
  //保证小数点只出现一次，而不能出现两次以上
  number_only = number_only.replace(".", "$#$").replace(/\./g, "").replace("$#$", ".");
  //保证只能输入两个小数  
  // number_only = number_only.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3');
  //一位小数
  number_only = number_only.replace(/^(\-)*(\d+)\.(\d).*$/, '$1$2.$3');

  number_only = parseFloat(number_only)
  return number_only;
}

const isEmpty = (v) => {
  switch (typeof v) {
    case 'undefined':
      return true;
    case 'string':
      if (v.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0 || v == '' || v.trim().length == 0) return true;
      break;
    case 'boolean':
      if (!v) return true;
      break;
    case 'number':
      if (0 === v || isNaN(v)) return true;
      break;
    case 'object':
      if (null === v || v.length === 0) return true;
      for (var i in v) {
        return false;
      }
      return true;
  }
}


// console.log(dateFormat("YYYY.mm.dd HH:MM:SS", new Date()))  =>String
const dateFormat = (fmt, date) => {
  let ret;
  const opt = {
    "Y+": date.getFullYear().toString(),        // 年
    "m+": (date.getMonth() + 1).toString(),     // 月
    "d+": date.getDate().toString(),            // 日
    "H+": date.getHours().toString(),           // 时
    "M+": date.getMinutes().toString(),         // 分
    "S+": date.getSeconds().toString()          // 秒
    // 有其他格式化字符需求可以继续添加，必须转化成字符串
  };
  for (let k in opt) {
    ret = new RegExp("(" + k + ")").exec(fmt);
    if (ret) {
      fmt = fmt.replace(ret[1], (ret[1].length === 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
    }
  }
  return fmt;
}

const toDetails = (_this, bookId) => {
  _this.$router.push({ path: "/details", query: { bookId } })
}

// （搜索，输入）（窗口大小resize）
// 防抖：n 秒后在执行该事件，若在 n 秒内被重复触发，则重新计时

function debounce (fn, interval = 500, localImmediate = 0) {
  let timeout = null;
  return function () {

    // 是否需要第一次执行默认
    if (localImmediate) {       //加个参数  localImmediate = 0
      // 标记为，用于标记第一次是否立即执行 
      localImmediate = false;
      fn.apply(this, arguments);
    }

    timeout = setTimeout(() => {
      fn.apply(this, arguments);
    }, interval);
  };
}

// （滚动）
// 节流： n 秒内只运行一次，若在 n 秒内重复触发，只有一次生效

function throttle (fn, interval = 500) {
  let canRun = true;
  return function () {
    if (!canRun) return;
    canRun = false;
    setTimeout(() => {
      fn.apply(this, arguments);
      canRun = true;
    }, interval);
  };
}

// 方案2  第一下点击会立即执行一次
function throttles (fn, wait) {
  let date = Date.now()
  return function () {
    let now = Date.now()
    if (now - date > wait) {
      fn.call(this, arguments)
      date = now
    }
  }
}





export { onlyNumOnePoint, isEmpty, dateFormat, onlyNumOneDecimal, toDetails, debounce, throttle };